home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / faq-s.zip / LINEEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1990-09-29  |  9KB  |  391 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit lineedit;
  5.  
  6. interface
  7.  
  8. uses gentypes,configrt,gensubs,subs1,subs2,modem;
  9.  
  10. function linereedit (var m:message; gettitle:boolean):boolean;
  11.  
  12. implementation
  13.  
  14. function linereedit (var m:message; gettitle:boolean):boolean;
  15. var done,editmode:boolean;
  16.     curline,r1,r2,cols:integer;
  17.  
  18.   procedure init;
  19.   begin
  20.     if eightycols in urec.config
  21.       then cols:=79
  22.       else cols:=39;
  23.     linereedit:=false;
  24.     done:=false;
  25.     editmode:=false;
  26.     curline:=1;
  27.     if m.numlines=0
  28.       then begin
  29.        writeln (^B^M'[FAQ '+ver+' Standard Message Editor]');
  30.        writeln (  ^B'[Enter text, ',maxmessagesize,' lines max]')
  31.       end
  32.       else begin
  33.         writeln (^B^M'Re-editing Message.');
  34.         writeln ('Current size: '^S,m.numlines);
  35.         writeln ('Note: Inserting before line 1.');
  36.         writeln ('/A will abort changes.'^M)
  37.       end;
  38.     writeln ('[/S to Save - /? for Help]'^B^M)
  39.   end;
  40.  
  41.   procedure setbreak;
  42.   begin
  43.     clearbreak;
  44.     nobreak:=true;
  45.     dontstop:=true;
  46.     wordwrap:=true;
  47.     linecount:=0
  48.   end;
  49.  
  50.   function msgisblank:boolean;
  51.   begin
  52.     if m.numlines>0 then msgisblank:=false else begin
  53.       writestr ('Sorry, message blank!');
  54.       msgisblank:=true
  55.     end
  56.   end;
  57.  
  58.   function getrange:boolean;
  59.   begin
  60.     parserange (m.numlines,r1,r2);
  61.     getrange:=r1<>0
  62.   end;
  63.  
  64.   function getlinenum (txt:mstr):boolean;
  65.   begin
  66.     writestr ('Line number to '+txt+':');
  67.     r1:=valu(input);
  68.     r2:=r1;
  69.     if (r1>=1) and (r1<=m.numlines)
  70.       then getlinenum:=true
  71.       else begin
  72.         getlinenum:=false;
  73.         writeln (^R'Invalid line!')
  74.       end
  75.   end;
  76.  
  77.   procedure inslines (r1,r2:integer);
  78.   var n,cnt:integer;
  79.   begin
  80.     n:=r2-r1+1;
  81.     m.numlines:=m.numlines+n;
  82.     for cnt:=m.numlines downto r2+1 do m.text[cnt]:=m.text[cnt-n]
  83.   end;
  84.  
  85.   procedure dellines (r1,r2:integer);
  86.   var n,cnt:integer;
  87.   begin
  88.     n:=r2-r1+1;
  89.     m.numlines:=m.numlines-n;
  90.     for cnt:=r1 to m.numlines do m.text[cnt]:=m.text[cnt+n]
  91.   end;
  92.  
  93.   procedure insertline;
  94.   var cnt:integer;
  95.   begin
  96.     if m.numlines=maxmessagesize then exit;
  97.     inslines (curline,curline);
  98.     m.text[curline]:=input;
  99.     curline:=curline+1
  100.   end;
  101.  
  102.   function iseditcommand:boolean;
  103.   begin
  104.     iseditcommand:=(input[1]='/') and (length(input)>0)
  105.   end;
  106.  
  107.   function userissure:boolean;
  108.   begin
  109.     writestr ('Warning!  Message will be erased!');
  110.     writestr ('Confirm [y/n]:');
  111.     userissure:=yes
  112.   end;
  113.  
  114.   procedure topofmsg;
  115.   begin
  116.     writeln (^R'--Top of msg--')
  117.   end;
  118.  
  119.   procedure abortmes;
  120.   begin
  121.     done:=userissure
  122.   end;
  123.  
  124.   procedure backline;
  125.   begin
  126.     if m.numlines<1 then begin
  127.       topofmsg;
  128.       exit
  129.     end;
  130.     writeln (^R'<Correct previous line>');
  131.     curline:=curline-1;
  132.     dellines (curline,curline)
  133.   end;
  134.  
  135.   procedure continuemes;
  136.   begin
  137.     writeln (^B^R^M'Continue your message...');
  138.     curline:=m.numlines+1;
  139.     editmode:=false
  140.   end;
  141.  
  142.   procedure deletelines;
  143.   begin
  144.     if not getrange then exit;
  145.     if (r1=1) and (r2=m.numlines) then begin
  146.       writestr ('Delete whole message? *');
  147.       if not yes then exit
  148.     end;
  149.     dellines (r1,r2)
  150.   end;
  151.  
  152.   procedure seteditmode;
  153.   begin
  154.     if editmode
  155.       then writestr ('You are already in edit mode!')
  156.       else editmode:=true
  157.   end;
  158.  
  159.   procedure fixline;
  160.   var tmp:lstr;
  161.   begin
  162.     if not getlinenum ('fix') then exit;
  163.     setbreak;
  164.     writeln ('Line currently reads:');
  165.     writeln (m.text[r1],^M);
  166.     wordwrap:=false;
  167.     buflen:=cols;
  168.     beginwithspacesok:=true;
  169.     writestr ('Enter new line:'^M'*');
  170.     if length(input)<>0 then m.text[r1]:=input;
  171.     continuemes
  172.   end;
  173.  
  174.   procedure insertlines;
  175.   begin
  176.     if not getlinenum ('insert before') then continuemes;
  177.     curline:=r1
  178.   end;
  179.  
  180.   procedure listmes;
  181.   var cnt,r1,r2:integer;
  182.       linenum:boolean;
  183.   begin
  184.     if msgisblank then exit;
  185.     parserange (m.numlines,r1,r2);
  186.     if r1=0 then exit;
  187.     writestr ('Line numbers? *');
  188.     linenum:=yes;
  189.     write (^R);
  190.     for cnt:=r1 to r2 do begin
  191.       if linenum then writeln (cnt,':');
  192.       writeln (m.text[cnt]);
  193.       if break then exit
  194.     end
  195.   end;
  196.  
  197.   procedure centerline;
  198.   var spaces:lstr;
  199.   begin
  200.     fillchar (spaces[1],80,32);
  201.     if editmode then begin
  202.       setbreak;
  203.       buflen:=cols;
  204.       wordwrap:=false;
  205.       writestr ('Enter line to center:'^M'*')
  206.     end else delete(input,1,1);
  207.     while (length(input)>0) and (input[1]=' ') do delete (input,1,1);
  208.     if length(input)=0 then exit;
  209.     spaces[0]:=chr((cols-length(input)) div 2);
  210.     input:=spaces+input;
  211.     insertline
  212.   end;
  213.  
  214.   procedure clearmes;
  215.   begin
  216.     if userissure then begin
  217.       writestr ('Starting message over...');
  218.       m.numlines:=0;
  219.       curline:=1
  220.     end
  221.   end;
  222.  
  223.   procedure searchandreplace;
  224.   var sfor,repw:lstr;
  225.       l:^lstr;
  226.       ask:boolean;
  227.       cl,cp,sl,max:integer;
  228.  
  229.     procedure replace;
  230.     var new,old:lstr;
  231.     begin
  232.       old:=copy (l^,cp,sl);
  233.       new:=repw;
  234.       if length(new)>0 then
  235.         if old[1] in ['A'..'Z']
  236.           then new[1]:=upcase(new[1]);
  237.       delete (l^,cp,sl);
  238.       while length(l^)+length(new)>cols do l^[0]:=pred(l^[0]);
  239.       insert (new,l^,cp);
  240.       cp:=cp+length(new)-1
  241.     end;
  242.  
  243.     procedure maybereplace;
  244.     var cnt:integer;
  245.     begin
  246.       if ask then begin
  247.         writeln (^B^M,cl,':'^M,l^);
  248.         for cnt:=1 to cp-1 do write (' ');
  249.         for cnt:=1 to sl do write ('^');
  250.         writeln;
  251.         writestr ('Replace [Y/N]:');
  252.         if not yes then exit
  253.       end;
  254.       replace
  255.     end;
  256.  
  257.   begin
  258.     if msgisblank then exit;
  259.     writestr ('Search for:');
  260.     if length(input)=0 then exit;
  261.     sfor:=upstring(input);
  262.     sl:=length(input);
  263.     writestr ('Replace with:');
  264.     repw:=input;
  265.     if length (input)>25 then exit;
  266.     writestr ('Ask each time? *');
  267.     ask:=yes;
  268.     max:=length(l^)-sl+1;
  269.     for cl:=1 to m.numlines do begin
  270.       l:=addr(m.text[cl]);
  271.       max:=length(l^)-sl+1;
  272.       cp:=0;
  273.       while cp<max do begin
  274.         cp:=cp+1;
  275.         if match(sfor,copy(l^,cp,sl)) then maybereplace;
  276.         max:=length(l^)-sl+1
  277.       end
  278.     end;
  279.     writeln (^B^M'Search and replace complete')
  280.   end;
  281.  
  282.   procedure savemes;
  283.   begin
  284.     done:=true;
  285.     if m.numlines=0
  286.       then writestr ('Message blank!')
  287.       else begin
  288.         writestr ('Saving..');
  289.         linereedit:=true
  290.       end
  291.   end;
  292.  
  293.   procedure retitle;
  294.   begin
  295.     if gettitle then begin
  296.       writeln (^R'Title is: '^S+m.title);
  297.       writestr ('Enter new title: &');
  298.       if length(input)>0 then m.title:=input
  299.     end else writestr ('This message can''t have a title.')
  300.   end;
  301.  
  302.   procedure edithelp;
  303.   begin
  304.     printfile (textfiledir+'Edithelp.');
  305.     editmode:=true
  306.   end;
  307.  
  308.   procedure editcommand;
  309.   var k:char;
  310.   begin
  311.     while iseditcommand and (length(input)>0) do delete (input,1,1);
  312.     if length(input)=0 then begin
  313.       editmode:=true;
  314.       exit
  315.     end;
  316.     k:=upcase(input[1]);
  317.     case k of
  318.       'A':abortmes;
  319.       'B':backline;
  320.       'C':continuemes;
  321.       'D':deletelines;
  322.       'E':seteditmode;
  323.       'F':fixline;
  324.       'I':insertlines;
  325.       'L':listmes;
  326.       'M':centerline;
  327.       'N':clearmes;
  328.       'R':searchandreplace;
  329.       'S':savemes;
  330.       'T':retitle
  331.       else edithelp
  332.     end
  333.   end;
  334.  
  335.   procedure editcommands;
  336.   begin
  337.     editcommand;
  338.     while editmode and not done do begin
  339.       writestr (^M'Edit Command [?/Help]:');
  340.       if hungupon then done:=true else editcommand
  341.     end
  342.   end;
  343.  
  344.   procedure getline;
  345.   begin
  346.     setbreak;
  347.     input:='/E';
  348.     if m.numlines=maxmessagesize then begin
  349.       writeln ('Sorry, message is full!');
  350.       exit
  351.     end;
  352.     if hungupon then exit;
  353.     if m.numlines=maxmessagesize-3 then writeln ('3 lines left!');
  354.     if curline>m.numlines+1 then curline:=m.numlines+1;
  355.     lastprompt:='Continue your message...'^M;
  356.     buflen:=cols;
  357.     getstr (1);
  358.     if input=^H
  359.       then if curline>1
  360.         then
  361.           begin
  362.             writeln ('--Back--');
  363.             curline:=curline-1;
  364.             chainstr:=m.text[curline];
  365.             dellines (curline,curline)
  366.           end
  367.         else topofmsg
  368.       else if not iseditcommand then insertline
  369.   end;
  370.  
  371.   procedure getlines;
  372.   begin
  373.     repeat
  374.       getline
  375.     until hungupon or iseditcommand or (m.numlines=maxmessagesize);
  376.     if not iseditcommand then input:='/'
  377.   end;
  378.  
  379. begin
  380.   init;
  381.   repeat
  382.     getlines;
  383.     editcommands
  384.   until done;
  385.   writeln (^B^M^M)
  386. end;
  387.  
  388. begin
  389. end.
  390.  
  391.